fn main() {
    // 引用

    println!("=====没有使用引用=====");
    {
        let s1 = givesOwneShip();
        println!("s1={}", s1);

        let s2 = String::from("hello");
        let s3 = takesAndGivesBack(s2);
        // 这里已无法使用 s2，只能使用返回值
        println!("s2={}", s3);

        fn givesOwneShip() -> String {
            let s = String::from("hello");
            s
        }

        fn takesAndGivesBack(s: String) -> String {
            s
        }
    }

    println!("=====引用的基本使用=====");
    {
        let mut s1 = String::from("hello");
        let mut len = getLength(&s1);
        println!("字符串={}, 长度={}", s1, len);

        fn getLength(s: &String) -> usize {
            return s.len();
        }
    }

    println!("=====可变引用=====");
    {
        let mut s1 = String::from("hello");
        modifyString(&mut s1);
        println!("改变后的字符串={}",s1);

        fn modifyString(s: &mut String){
            s.push_str(", world");
        }
    }


    println!("=====悬垂引用=====");
    {
        // let ref_s = dangle();
        //
        // fn dangle() -> &String {
        //     let s = String::from("hello");
        //     return &s;
        // }
    }

}
